apache的rewrite规则

        rewrite的规则:

1
2
3
4
5
6
7
8
9
10
11
12
13
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^.*Firefox/4.0* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^.*Tomato Bot/1.0* [NC]
RewriteCond %{REQUEST_URI} !^/404*
RewriteRule .* /404.html
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^*Firefox/4.0* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^*Tomato Bot/1.0* [NC]
RewriteRule .* - [F]
</IfModule>
  • RewriteEngine on #打开rewirte功能
  • RewriteCond %{变量} 正则 [标志]
  • RewriteRule 正则1 正则2
  • 正则1一般是从www.*.com/这个以后开始的
  • - [F]: 这里的-表示替换

        标志:

  1. R=301 强制外部重定向
    强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
  2. [F]禁用URL,返回403HTTP状态码。
    30 G 强制URL为GONE,返回410HTTP状态码。
  3. P 强制使用代理转发。
  4. L 表明当前规则是最后一条规则,停止分析以后规则的重写。
  5. N 重新从第一条规则开始运行重写过程。
  6. C 与下一条规则关联

        如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。

  1. [T]=MIME-type(force MIME type)
  2. [NS] (used only if no internal sub-request) 只用于不是内部子请求
  3. NC 不区分大小写
  4. QSA 追加请求字符串
  5. NE 不在输出转义特殊字符

        例如:RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed

  1. PT 传递给下一个处理

        例如:

1
2
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
  1. S=num) 跳过num条规则
  2. E=VAR:VAL 设置环境变量
  3. [OR] 或者 两个RewriteCond 之间什么都不写就是 且

        变量:

  • %{HTTP_USER_AGENT} 表示:访问的user_agent
  • %{HTTP_HOST} 表示:当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“/”
  • %{REQUEST_URI} 表示:表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,

        www.123.com/xiang/1.html

        RewriteRule:

1
RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]